From 853db7431ad63fbf0fa58879dd179876d25e0997 Mon Sep 17 00:00:00 2001 From: fmdkdd Date: Fri, 16 Dec 2016 00:05:58 +0100 Subject: [PATCH] Fix `--message-format JSON` when rustc emits non-JSON warnings The `--message-format JSON` flag parses all the stderr output of rustc to JSON, but rustc can emit non-JSON lines to stderr (e.g., for warning about the unstable `-Z` flag on the stable channel), causing cargo to fail reporting compilation errors when using `--message-format JSON`. This commit adds a check to look for lines beginning with `{` to only parse these lines as JSON. Other lines from rustc are forwarded to the stderr of cargo. Fixes #3390. --- src/cargo/ops/cargo_rustc/mod.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 6c5991053..24f9deb0a 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -2,6 +2,7 @@ use std::collections::{HashMap, HashSet}; use std::env; use std::ffi::{OsStr, OsString}; use std::fs; +use std::io::{self, Write}; use std::path::{self, PathBuf}; use std::sync::Arc; @@ -297,15 +298,22 @@ fn rustc(cx: &mut Context, unit: &Unit) -> CargoResult { Ok(()) }, &mut |line| { - let compiler_message = json::Json::from_str(line).map_err(|_| { - internal(&format!("compiler produced invalid json: `{}`", line)) - })?; - - machine_message::emit(machine_message::FromCompiler { - package_id: &package_id, - target: &target, - message: compiler_message, - }); + // stderr from rustc can have a mix of JSON and non-JSON output + if line.starts_with("{") { + // Handle JSON lines + let compiler_message = json::Json::from_str(line).map_err(|_| { + internal(&format!("compiler produced invalid json: `{}`", line)) + })?; + + machine_message::emit(machine_message::FromCompiler { + package_id: &package_id, + target: &target, + message: compiler_message, + }); + } else { + // Forward non-JSON to stderr + writeln!(io::stderr(), "{}", line)?; + } Ok(()) }, ).map(|_| ()) -- 2.30.2